"""
@File    ：base_page.py
@Author  ：ixiaodu
@Date    ：2024/9/6
@Desc    ：
"""
from playwright.sync_api import Page, Locator, expect
from page_object.locators import Locators
from utils.my_date import 返回当前时间xxxx_xx_xx加N天


class BasePage:

    def __init__(self, page: Page):
        self.page = page
        self.url = "https://alpha-manage.douya.wang/"
        self.locators = Locators(self.page)

    def navigate(self):
        self.page.goto(self.url)

    def click_button(self, button_name, nth=-1):
        """
        点击按钮
        :param nth:
        :param button_name:
        :return:
        """
        self.locators.button(button_name, nth).click()

    def search(self, search_for_content: str, placeholder=None):
        """
        搜索方法
        :param search_for_content: 搜索内容
        :param placeholder: 提示文字
        :return:
        """
        if placeholder:
            self.page.locator(
                f"//div[@class='search-item-content']//input[contains(@placeholder,'{placeholder}')]").fill(search_for_content)
        else:
            self.page.locator(".ant-input-affix-wrapper input").fill(search_for_content)
        self.page.wait_for_load_state("networkidle")

    def input_box(self, field_name: str, value: str, 表单最上层定位: Locator = None):
        """
        填写输入框方法
        :param 表单最上层定位:
        :param field_name: 字段名
        :param value: 输入内容
        :return:
        """
        if 表单最上层定位:
            表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(field_name)).locator("input,textarea").locator("visible=true").last.fill(value)
        else:
            self.locators.表单项中包含操作元素的最上级div(field_name).locator("input,textarea").locator("visible=true").last.fill(value)

    def 表单_下拉框选择(self, field_name: str, value: str | int, 表单最上层定位: Locator = None, timeout: float = None):
        if 表单最上层定位:
            表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(field_name)).locator("visible=true").click(timeout=timeout)
            if 表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(field_name)).locator('//input[@type="search"]').count():
                表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(field_name)).locator('//input[@type="search"]').fill(value, timeout=timeout)
            self.page.locator(".el-select-dropdown.el-popper").locator("visible=true").get_by_text(value).click(timeout=timeout)
        else:
            self.locators.表单项中包含操作元素的最上级div(field_name).locator("visible=true").click(timeout=timeout)
            if self.locators.表单项中包含操作元素的最上级div(field_name).locator('//input[@type="search"]').count():
                self.locators.表单项中包含操作元素的最上级div(field_name).locator('//input[@type="search"]').fill(value, timeout=timeout)
            self.page.locator(".el-select-dropdown.el-popper").locator("visible=true").get_by_text(value).click(timeout=timeout)

    def 表单_radio选择(self, 表单项名称: str, 需要选择的项: str, 表单最上层定位: Locator = None, timeout: float = None):
        if 表单最上层定位:
            表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(表单项名称)).locator("label").locator("visible=true").filter(has_text=需要选择的项).click(timeout=timeout)
        else:
            self.locators.表单项中包含操作元素的最上级div(表单项名称).locator("label").locator("visible=true").filter(has_text=需要选择的项).click(timeout=timeout)

    def 表单_switch开关(self, 表单项名称: str, 开关状态: str, 表单最上层定位: Locator = None, timeout: float = None):
        if "开" in 开关状态 or "是" in 开关状态:
            开关状态bool = True
        else:
            开关状态bool = False
        if 表单最上层定位:
            表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(表单项名称)).get_by_role("switch").set_checked(开关状态bool, timeout=timeout)
        else:
            self.locators.表单项中包含操作元素的最上级div(表单项名称).get_by_role("switch").set_checked(开关状态bool, timeout=timeout)

    def 表单_日期(self, 表单项名称: str, 日期: str, 表单最上层定位: Locator = None, timeout: float = None):
        if 表单最上层定位:
            日期控件定位 = 表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(表单项名称))
        else:
            日期控件定位 = self.locators.表单项中包含操作元素的最上级div(表单项名称)
        日期列表 = 日期.split(",")
        for index, 单日期 in enumerate(日期列表):
            try:
                int(单日期)
                格式化后的日期 = 返回当前时间xxxx_xx_xx加N天(int(单日期))
            except:
                格式化后的日期 = 单日期
            日期控件定位.locator("input").nth(index).click(timeout=timeout)
            日期控件定位.locator("input").nth(index).fill(格式化后的日期, timeout=timeout)
            self.page.keyboard.press("Enter")

    def upload_file(self, field_name: str, file_path: str = r"C:\Users\29690\Desktop\图片\vip.jpg", 表单最上层定位: Locator = None):
        """
        表单上传文件
        :param field_name:
        :param file_path:
        :param 表单最上层定位:
        :return:
        """
        if 表单最上层定位:
            表单最上层定位.locator(self.locators.表单项中包含操作元素的最上级div(field_name)).locator('//input[@type="file"]').set_input_files(file_path)
        else:
            self.locators.表单项中包含操作元素的最上级div(field_name).locator('//input[@type="file"]').set_input_files(file_path)

    def download_images(self,locator):
        """
        下载图片
        :param locator: 元素位置
        :return:
        """
        captcha_element = self.page.wait_for_selector(locator)

        # 获取验证码图片的 URL
        captcha_url = captcha_element.get_attribute('src')

        # 下载验证码图片
        response = self.page.goto(captcha_url)
        captcha_bytes = response.body()

        # 保存验证码图片到本地文件
        with open('./files/captcha.gif', 'wb') as f:
            f.write(captcha_bytes)